home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / circuits / spice2g6.z / spice2g6 / spice / Fortran / tmpupd.f < prev    next >
Encoding:
Text File  |  1989-02-03  |  9.4 KB  |  259 lines

  1.       subroutine tmpupd
  2.       implicit double precision (a-h,o-z)
  3. c
  4. c     this routine updates the temperature-dependent parameters in the
  5. c device models.  it also updates the values of temperature-dependent
  6. c resistors.  the updated values are printed.
  7. c
  8. c spice version 2g.6  sccsid=tabinf 3/15/83
  9.       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
  10.      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
  11.      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
  12.      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
  13.      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
  14.      5   imynl,imvn,lcvn,nsnod,nsmat,nsval,icnod,icmat,icval,
  15.      6   loutpt,lpol,lzer,irswpf,irswpr,icswpf,icswpr,irpt,jcpt,
  16.      7   irowno,jcolno,nttbr,nttar,lvntmp
  17. c spice version 2g.6  sccsid=miscel 3/15/83
  18.       common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
  19.      1  defas,rstats(50),iwidth,lwidth,nopage
  20. c spice version 2g.6  sccsid=cirdat 3/15/83
  21.       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
  22.      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs,numalt,numcyc
  23. c spice version 2g.6  sccsid=status 3/15/83
  24.       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
  25.      1   xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon,
  26.      2   iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile
  27. c spice version 2g.6  sccsid=knstnt 3/15/83
  28.       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
  29.      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox,
  30.      2   pivtol,pivrel
  31. c spice version 2g.6  sccsid=blank 3/15/83
  32.       common /blank/ value(200000)
  33.       integer nodplc(64)
  34.       complex cvalue(32)
  35.       equivalence (value(1),nodplc(1),cvalue(1))
  36. c
  37. c
  38.       dimension tmptit(4)
  39.       data tmptit / 8htemperat, 8hure-adju, 8hsted val, 8hues      /
  40. c
  41. c
  42.       reftmp=27.0d0+ctok
  43.       temp1=value(itemps+itemno-1)+ctok
  44.       temp2=value(itemps+itemno)+ctok
  45.       xkt=boltz*temp2
  46.       oldvt=vt
  47.       vt=xkt/charge
  48.       oldeg=egfet
  49.       egfet=1.16d0-(7.02d-4*temp2*temp2)/(temp2+1108.0d0)
  50.       arg=-egfet/(xkt+xkt)+1.1150877d0/(boltz*(reftmp+reftmp))
  51.       ratio=temp2/temp1
  52.       ratlog=dlog(ratio)
  53.       ratio1=ratio-1.0d0
  54.       dtemp=temp2-reftmp
  55.       delt=value(itemps+itemno)-value(itemps+1)
  56.       deltsq=delt*delt
  57.       fact2=temp2/reftmp
  58.       xni=1.45d16*fact2*dsqrt(fact2)*dexp(charge*arg)
  59.       pbfact=-2*vt*(1.5d0*dlog(fact2)+charge*arg)
  60.       xkt1=boltz*temp1
  61.       vt1=xkt1/charge
  62.       egfet1=1.16d0-(7.02d-4*temp1*temp1)/(temp1+1108.0d0)
  63.       arg1=-egfet1/(xkt1+xkt1)+1.1150877d0/(boltz*(reftmp+reftmp))
  64.       fact1=temp1/reftmp
  65.       pbfat1=-2*vt1*(1.5d0*dlog(fact1)+charge*arg1)
  66.     5 call title(0,lwidth,1,tmptit)
  67. c
  68. c  resistors
  69. c
  70.       loc=locate(1)
  71.       ititle=0
  72.    10 if (loc.eq.0) go to 100
  73.       locv=nodplc(loc+1)
  74.       tc1=value(locv+3)
  75.       tc2=value(locv+4)
  76.       if (tc1.ne.0.0d0) go to 20
  77.       if (tc2.eq.0.0d0) go to 40
  78.    20 if (ititle.ne.0) go to 30
  79.       write (iofile,21)
  80.    21 format(//'0**** resistors',/,'0name',8x,'value',//)
  81.       ititle=1
  82.    30 rnew=value(locv+2)*(1.0d0+tc1*delt+tc2*deltsq)
  83.       value(locv+1)=1.0d0/rnew
  84.       write (iofile,31) value(locv),rnew
  85.    31 format(1x,a8,1p6d11.3)
  86.    40 loc=nodplc(loc)
  87.       go to 10
  88. c
  89. c  diode model
  90. c
  91.   100 loc=locate(21)
  92.       if (loc.eq.0) go to 200
  93.       write (iofile,101)
  94.   101 format(//'0**** diode model parameters',/,'0name',9x,'is',9x,'vj',
  95.      1   8x,'cjo',//)
  96.   110 if (loc.eq.0) go to 200
  97.       locv=nodplc(loc+1)
  98. c...  is(t2)=is(t1)*dexp(eg/(n*vt)*(t2/t1-1))*(t2/t1)**(xti/n)
  99.       xn=value(locv+3)
  100.       factor=ratio1*value(locv+8)/(xn*vt)+value(locv+9)/xn*ratlog
  101.       factor=dexp(factor)
  102.       value(locv+1)=value(locv+1)*factor
  103.       oldpb=value(locv+6)
  104.       pbo=(value(locv+6)-pbfat1)/fact1
  105.       gmaold=(oldpb-pbo)/pbo
  106.       value(locv+5)=value(locv+5)/(1.0d0+value(locv+7)
  107.      1     *(400.0d-6*(temp1-reftmp)-gmaold))
  108.   120 value(locv+6)=fact2*pbo+pbfact
  109.       gmanew=(value(locv+6)-pbo)/pbo
  110.       value(locv+5)=value(locv+5)
  111.      1   *(1.0d0+value(locv+7)*(400.0d-6*dtemp-gmanew))
  112.       pbrat=value(locv+6)/oldpb
  113.       value(locv+12)=value(locv+12)*pbrat
  114.       value(locv+15)=value(locv+15)*pbrat
  115.       vte=value(locv+3)*vt
  116.       value(locv+18)=vte*dlog(vte/(root2*value(locv+1)))
  117.       write (iofile,31) value(locv),value(locv+1),value(locv+6),
  118.      1                  value(locv+5)
  119.       loc=nodplc(loc)
  120.       go to 110
  121. c
  122. c  bipolar transistor model
  123. c
  124.   200 loc=locate(22)
  125.       if (loc.eq.0) go to 300
  126.       write (iofile,201)
  127.   201 format(//'0**** bjt model parameters',/,'0name',9x,'js',8x,'bf ',
  128.      1   7x,'ise',7x,'br ',7x,'isc',7x,'vje',7x,'cje',7x,'vjc',
  129.      2   7x,'cjc',//)
  130.   210 if (loc.eq.0) go to 300
  131.       locv=nodplc(loc+1)
  132. c...  is(t2)=is(t1)*dexp(eg/vt*(t2/t1-1))*(t2/t1)**xti
  133.       factln=ratio1*value(locv+42)/vt+value(locv+43)*ratlog
  134.       factor=dexp(factln)
  135.       value(locv+1)=value(locv+1)*factor
  136.       tb=value(locv+41)
  137.       bfactr=dexp(tb*ratlog)
  138.       value(locv+2)=value(locv+2)*bfactr
  139.       value(locv+8)=value(locv+8)*bfactr
  140.       value(locv+6)=value(locv+6)*dexp(factln/value(locv+7))/bfactr
  141.       value(locv+12)=value(locv+12)*dexp(factln/value(locv+13))
  142.      1               /bfactr
  143.       oldpb=value(locv+22)
  144.       pbo=(value(locv+22)-pbfat1)/fact1
  145.       gmaold=(oldpb-pbo)/pbo
  146.       value(locv+21)=value(locv+21)/(1.0d0+value(locv+23)
  147.      1     *(400.0d-6*(temp1-reftmp)-gmaold))
  148.   220 value(locv+22)=fact2*pbo+pbfact
  149.       gmanew=(value(locv+22)-pbo)/pbo
  150.       value(locv+21)=value(locv+21)
  151.      1   *(1.0d0+value(locv+23)*(400.0d-6*dtemp-gmanew))
  152.       pbrat=value(locv+22)/oldpb
  153.       value(locv+46)=value(locv+46)*pbrat
  154.       value(locv+47)=value(locv+47)*pbrat
  155.       oldpb=value(locv+30)
  156.       pbo=(value(locv+30)-pbfat1)/fact1
  157.       gmaold=(oldpb-pbo)/pbo
  158.       value(locv+29)=value(locv+29)/(1.0d0+value(locv+31)
  159.      1     *(400.0d-6*(temp1-reftmp)-gmaold))
  160.   230 value(locv+30)=fact2*pbo+pbfact
  161.       gmanew=(value(locv+30)-pbo)/pbo
  162.       value(locv+29)=value(locv+29)
  163.      1   *(1.0d0+value(locv+31)*(400.0d-6*dtemp-gmanew))
  164.       pbrat=value(locv+30)/oldpb
  165.       value(locv+50)=value(locv+50)*pbrat
  166.       value(locv+51)=value(locv+51)*pbrat
  167.       value(locv+54)=vt*dlog(vt/(root2*value(locv+1)))
  168.       write (iofile,211) value(locv),value(locv+1),value(locv+2),
  169.      1   value(locv+6),value(locv+8),value(locv+12),value(locv+22),
  170.      2   value(locv+21),value(locv+30),value(locv+29)
  171.   211 format(1x,a8,1p9d10.3)
  172.       loc=nodplc(loc)
  173.       go to 210
  174. c
  175. c  jfet model
  176. c
  177.   300 loc=locate(23)
  178.       if (loc.eq.0) go to 400
  179.       write (iofile,301)
  180.   301 format(//'0**** jfet model parameters',/,'0name',9x,'is',9x,'pb',
  181.      1   8x,'cgs',8x,'cgd',//)
  182.   310 if (loc.eq.0) go to 400
  183.       locv=nodplc(loc+1)
  184.       value(locv+9)=value(locv+9)*dexp(ratio1*1.11d0/vt)
  185.       oldpb=value(locv+8)
  186.       pbo=(value(locv+8)-pbfat1)/fact1
  187.       gmaold=(oldpb-pbo)/pbo
  188.       oldcjf=1.0d0+0.5d0*(400.0d-6*(temp1-reftmp)-gmaold)
  189.       value(locv+6)=value(locv+6)/oldcjf
  190.       value(locv+7)=value(locv+7)/oldcjf
  191.   320 value(locv+8)=fact2*pbo+pbfact
  192.       gmanew=(value(locv+8)-pbo)/pbo
  193.       cjfact=1.0d0+0.5d0*(400.0d-6*dtemp-gmanew)
  194.       value(locv+6)=value(locv+6)*cjfact
  195.       value(locv+7)=value(locv+7)*cjfact
  196.       pbrat=value(locv+8)/oldpb
  197.       value(locv+12)=value(locv+12)*pbrat
  198.       value(locv+13)=value(locv+13)*pbrat
  199.       value(locv+16)=vt*dlog(vt/(root2*value(locv+9)))
  200.       write (iofile,31) value(locv),value(locv+9),value(locv+8),
  201.      1   value(locv+6),value(locv+7)
  202.       loc=nodplc(loc)
  203.       go to 310
  204. c
  205. c  mosfet model
  206. c
  207.   400 loc=locate(24)
  208.       iprnt=1
  209.   410 if (loc.eq.0) go to 1000
  210.       locv=nodplc(loc+1)
  211.       type=nodplc(loc+2)
  212.       if(iprnt.ne.0) write (iofile,401)
  213.   401 format(//'0**** mosfet model parameters',/,'0name',8x,'vto',8x,
  214.      1   'phi',9x,'pb',7x,'is(js)',7x,'kp',9x,'uo'//)
  215.       iprnt=0
  216.       ratio4=ratio*dsqrt(ratio)
  217.       value(locv+3)=value(locv+3)/ratio4
  218.       value(locv+29)=value(locv+29)/ratio4
  219.       oldphi=value(locv+5)
  220.       phio=(value(locv+5)-pbfat1)/fact1
  221.   415 value(locv+5)=fact2*phio+pbfact
  222.       phi=value(locv+5)
  223.       vfb=value(locv+44)-type*0.5d0*oldphi
  224.       vfb=vfb+0.5d0*(oldeg-egfet)
  225.       value(locv+44)=vfb+type*0.5d0*phi
  226.       value(locv+2)=value(locv+44)+type*value(locv+4)*dsqrt(phi)
  227.       value(locv+11)=value(locv+11)*dexp(-egfet/vt+oldeg/oldvt)
  228.       value(locv+21)=value(locv+21)*dexp(-egfet/vt+oldeg/oldvt)
  229.       oldpb=value(locv+12)
  230.       pbo=(value(locv+12)-pbfat1)/fact1
  231.       gmaold=(oldpb-pbo)/pbo
  232.       coeold=1.0d0+value(locv+18)*(400.0d-6*(temp1-reftmp)-gmaold)
  233.       value(locv+9)=value(locv+9)/coeold
  234.       value(locv+10)=value(locv+10)/coeold
  235.       value(locv+17)=value(locv+17)/coeold
  236.       value(locv+19)=value(locv+19)/(1.0d0+value(locv+20)
  237.      1     *(400.0d-6*(temp1-reftmp)-gmaold))
  238.   420 value(locv+12)=fact2*pbo+pbfact
  239.       gmanew=(value(locv+12)-pbo)/pbo
  240.       coenew=1.0d0+value(locv+18)*(400.0d-6*dtemp-gmanew)
  241.       value(locv+9)=value(locv+9)*coenew
  242.       value(locv+10)=value(locv+10)*coenew
  243.       value(locv+17)=value(locv+17)*coenew
  244.       value(locv+19)=value(locv+19)*
  245.      1   (1.0d0+value(locv+20)*(400.0d-6*dtemp-gmanew))
  246.       pbrat=value(locv+12)/oldpb
  247.       value(locv+37)=value(locv+37)*pbrat
  248.       value(locv+38)=value(locv+38)*pbrat
  249.       csat=dmax1(value(locv+11),value(locv+21))
  250.       write (iofile,31) value(locv),value(locv+2),value(locv+5),
  251.      1   value(locv+12),csat,value(locv+3),value(locv+29)
  252.   430 loc=nodplc(loc)
  253.       go to 410
  254. c
  255. c  finished
  256. c
  257.  1000 return
  258.       end
  259.